昨天已大致了解路由的建立,但是如果我們有好幾個方法都要共用一個路由呢?
這就是今天要討論的重點!
以 /book
作為範例,如果要因應各種請求方法做回覆,最基本的寫法為:
// app.js
app.get('/book', (req, res) => {
res.send('Get a book')
})
app.post('/book', (req, res) => {
res.send('Post a book')
})
app.delete('/book', (req, res) => {
res.send('Delete the book')
})
以上方式也可以順利完成請求回覆,但缺點就是有太多冗長的程式,
如果要把路由 /book
改成 /books
就要一次改 GET / POST / DELETE
等地方,
維護起來相對不容易,以下提供兩個方式做優化:
可以從昨天寫的 app.METHOD()
延伸,相同的路徑底下寫不同的方法:
// app.js
app.route('/book')
.get((req, res) => {
res.send('Get a book')
})
.post((req, res) => {
res.send('Post a book')
})
.delete((req, res) => {
res.send('Delete the book')
})
更好的方式,就是今天要著重介紹的路由模組化。
說到模組化,就要先說到 express.Router()
這個模組:
express.Router() 是一個路由系統,只要建立起 Router 物件,
然後設定這個物件的路由規則,就可以針對這系列的路由做管理。
我們實做看看會更有感覺:
ironman
專案底下建立一個 routes
資料夾。routes
資料夾建立 modules
資料夾和 index.js
的檔案(負責管理 modules 裡面所有路由)。modules
資料夾建立 book.j
s 檔案(負責管理 book 的相關路徑)。book.js
檔案引用 express.Router()
模組。將 book 路由的方法寫在底下,有關 book 路由的架構就初步完成了!
(注意,這裡的 path 是接續 /book 之後要串連的路徑,如果沒有的話就設定 /
)
// book.js
const express = require('express')
const router = express.Router()
// define the book page route by get method
router.get('/', (req, res) => {
res.send('Get a book')
})
// define the book route by post method
router.post('/', (req, res) => {
res.send('Post a book')
})
// define the book route by delete method
router.delete('/', (req, res) => {
res.send('Delete the book')
})
module.exports = router
之後就要將整個路由的流程引入 routes
資料夾底下的 index.js
和我們的主程式 app.js
。
// /routes/index.js
const express = require('express')
const router = express.Router()
const book = require('./modules/book') // book 路由
router.use('/book', book)
module.exports = router
// app.js
const express = require('express')
const router = require('./routes') // 引用 router 模組
const app = express()
const port = 3000
app.use(router) // 使用 router
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
將伺服器開起來後打開瀏覽器,也可以順利取得 book 頁面資料啦!
雖然感覺在寫的過程中比較繁複,但是將每個環節進行拆解之後,對於以後維護或除錯會很有幫助,
你會很感激當時有建立起模組化的自己
對於路由的介紹就到這裡結束,大家明天見~